[iOS][Obj-C] NSUserDefaults カンタン使用法
NSUserDefaults カンタン使用法
NSUserDefaults は、小規模なデータを保存するのにベンリですね。しかしながら、いささか記述が長いので、繰り返し様々なところで使う場合、ちょっとだるいかもしれません。
そこで今回は、NSUserDefaults を扱う Helper クラスを作成し、短い&見やすい&書きやすい記述でデータ保存を行う方法を扱います。
Helperクラスを作成
まず最初に一手間かけます。データ保存のための Helper クラスを作成します。今回は、以下のクラスが登場します。
- ViewController クラス(プロジェクト生成時に自動的に作成されたものを利用)
- DataSaveHelper クラス
まずは DataSaveHelper クラスから見て行きましょう。
ヘッダファイル
#import "Foundation/Foundation.h" @interface DataSaveHelper : NSObject @property (nonatomic) BOOL initialized; @property (nonatomic) NSInteger howManyTimesAppLaunched; @end
セーブするデータは以下の2種類です。それぞれプロパティとして定義しています。
- 初回起動時の初期化が済んだかを表す Bool 型の initialized
- 起動回数を表す NSInteger 型の howManyTimesAppLaunched
実装ファイル
実装ファイルでは、プロパティにより生成されたゲッタ・セッタをオーバーライドしています。永続化領域から値を読み込んで返したり、永続化領域に値を書き込んだりしています。
#import "DataSaveHelper.h" static NSString *const kKeyInitialized = @"initialized"; static NSString *const kKeyHowManyTimesAppLaunched = @"howManyTimesAppLaunched"; @implementation DataSaveHelper - (BOOL)initialized { return [[NSUserDefaults standardUserDefaults] boolForKey:kKeyInitialized]; } - (void)setInitialized:(BOOL)initialized { [[NSUserDefaults standardUserDefaults] setBool:initialized forKey:kKeyInitialized]; } - (NSInteger)howManyTimesAppLaunched { return [[NSUserDefaults standardUserDefaults] integerForKey:kKeyHowManyTimesAppLaunched]; } - (void)setHowManyTimesAppLaunched:(NSInteger)howManyTimesAppLaunched { [[NSUserDefaults standardUserDefaults] setInteger:howManyTimesAppLaunched forKey:kKeyHowManyTimesAppLaunched]; }
具体的に見て行きましょう。
キーの名前を予め定数として指定
static NSString *const kKeyInitialized = @"initialized"; static NSString *const kKeyHowManyTimesAppLaunched = @"howManyTimesAppLaunched";
このように定義しておくことで、補完が聞きますし、キー名のミスタイプも防げますね。
ゲッタ
- (BOOL)initialized { return [[NSUserDefaults standardUserDefaults] boolForKey:kKeyInitialized]; }
キーを指定して、値を取得後、値を返しています。
セッタ
- (void)setInitialized:(BOOL)initialized { [[NSUserDefaults standardUserDefaults] setBool:initialized forKey:kKeyInitialized]; }
キーを指定して、値を永続化領域に書き込んでいます。
上記セッタであれば、- (void)setInit あたりまで入力した時点で、 - (void)setInitialized:(BOOL)initialized まで補完してくれるでしょう。スラスラかけて、楽しいですね。
ViewController
#import "ViewController.h" #import "DataSaveHelper.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; DataSaveHelper *helper = [DataSaveHelper new]; if (helper.initialized) { NSLog(@"初回起動時の初期化は済んでいます"); } else { helper.initialized = YES; // 初回起動時の初期化処理など } helper.howManyTimesAppLaunched ++; NSLog(@"%ld", helper.howManyTimesAppLaunched); }
今回は Helper クラスの動作確認が目的ですので、viewDidLoadに直接書き込んでいきます。
上記では、DataSaveHelper クラスのインスタンスを生成し、ドット記法でゲッタ・セッタにアクセスし、値をセーブ・取得しています。
initialized を見て、もし初期化されていなかったら初期化処理をし、そうでなかったら、ログだけ出力。
その後、
viewDidLoad が呼ばれた回数 = 起動回数
と見做し、howManyTimesAppLaunched の値をインクリメント。起動回数をNSLogで出力しています。
こんなふうに、補完が効くので、データセーブ箇所で毎回 NSUserDefaults クラスやキー名の記述をするより、間違いが少なくなりますし、スラスラかけてコーディングが楽しくなりますね!
この手法は広く知られているとは思うのですが、まだ試されていない方は是非!